package comunicacion.simulador;

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLInputFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

public class ParserXml {	
	
	public static Document parseXmlFile(String xmlText) {
		// Pedimos la fabrica
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		Document dom = null;
		
		try {	
			// Obtenemos un builder
			DocumentBuilder db = dbf.newDocumentBuilder();
			// Esto permite dar entrada a partir de un string y no un archivo
			InputSource input = new InputSource();
			input.setCharacterStream(new StringReader(xmlText));
			
			// Aca se hace el parseo
			// Si hubiera que parsear desde archivo directamente, aca iria el nombre como entrada;
			// en este caso queremos parsear strings, asi que usamos lo de arriba
			dom = db.parse(input);
			return dom;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} 		
	}

	
	public static Robot getRobot(String xmlFileName, int idRobot) {
		Robot robot = null;
		
		Document doc = parseXmlFile(xmlFileName);
		
		if (doc != null) {
			// Obtenemos la raiz, que deberia ser Broadcast
			Element broadcast = doc.getDocumentElement();	
			
			NodeList robots = broadcast.getElementsByTagName("Robot_Entity");
			
			if (robots.getLength() == 0)
				System.out.println("Coleccion robots esta vacia");
			
			for (int i=0; i<robots.getLength(); i++) {				
				Element r = (Element) robots.item(i);
				
				if (getIntValue(r, "Entity_Id") == idRobot) {
					robot = new Robot();
					robot.setEntityId(idRobot);
					// Position
					robot.setPosX(getDoubleValue(r, "Position_X"));
					robot.setPosY(getDoubleValue(r, "Position_Y"));
					robot.setPosZ(getDoubleValue(r, "Position_Z"));
					// Rotation
					robot.setRotX(getDoubleValue(r, "Rotation_X"));
					robot.setRotY(getDoubleValue(r, "Rotation_Y"));
					robot.setRotZ(getDoubleValue(r, "Rotation_Z"));					
					
					break;
				}
			}
		}
		
		return robot;
	}
	
	/* Devuelve una coleccion con la informacion de los demas objetos */
	public static Robot[] getRobots(String xmlFileName, int miRobot) {		
		Robot[] coleccion = null;
		Robot robot = null;
		
		Document doc = parseXmlFile(xmlFileName);
		
		if (doc != null) {
			// Obtenemos la raiz, que deberia ser Broadcast
			Element broadcast = doc.getDocumentElement();	
			
			NodeList robots = broadcast.getElementsByTagName("Robot_Entity");
			
			if (robots.getLength() == 0)
				System.out.println("Coleccion robots esta vacia, no estoy ni yo");
			
			coleccion = new Robot[robots.getLength()];
			
			for (int i=0; i<robots.getLength(); i++) {				
				Element r = (Element) robots.item(i);
					
				robot = new Robot();
				robot.setEntityId(getIntValue(r, "Entity_Id"));
				// Position
				robot.setPosX(getDoubleValue(r, "Position_X"));
				robot.setPosY(getDoubleValue(r, "Position_Y"));
				robot.setPosZ(getDoubleValue(r, "Position_Z"));
				// Rotation
				robot.setRotX(getDoubleValue(r, "Rotation_X"));
				robot.setRotY(getDoubleValue(r, "Rotation_Y"));
				robot.setRotZ(getDoubleValue(r, "Rotation_Z"));
				
				coleccion[i] = robot;
			}
		}
		
		return coleccion;
	}
	
	
	private static String getTextValue(Element ele, String tagName) {
		String textVal = null;
		NodeList nl = ele.getElementsByTagName(tagName);
		if(nl != null && nl.getLength() > 0) {
			Element el = (Element)nl.item(0);
			// esto de abajo parece ser analogo a : textVal = el.getTextContent();
			textVal = el.getFirstChild().getNodeValue();
		}

		return textVal;
	}
	
	
	private static int getIntValue(Element ele, String tagName) {
		//in production application you would catch the exception
		return Integer.parseInt(getTextValue(ele,tagName));
	}
	
	private static double getDoubleValue(Element ele, String tagName) {
		return Double.parseDouble(getTextValue(ele, tagName));
	}
	
}

